package com.qingxin.sys.service;

import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

import com.qingxin.sys.dao.Updater;
import com.qingxin.sys.entity.SysConfig;
import com.qingxin.sys.mvc.SysError;


/**
 * 系统配置
 * @author Administrator
 *
 */
@Service
public class SysConfigService extends BaseService<SysConfig, String> {

	
	/**
	 * 获取配置值
	 * @param configCode
	 * @return
	 */
	@Cacheable(value = "sysConfigCache", key = "'GetConfigValue_' + #configCode")
	public String getConfigValue(String configCode){
		SysConfig sysConfig = getByProperty("configCode", configCode);
		if(sysConfig != null){
			return sysConfig.getConfigValue();
		}
		return null;
	}
	
	
	/**
	 * 获取所有系统配置列表
	 * @return
	 */
	@Cacheable(value = "sysConfigCache", key = "'ListAll'")
	@SuppressWarnings("unchecked")
	public List<SysConfig> listAll(){
		List<SysConfig> list = listByHql("from SysConfig");
		return list;
	}
	

	/**
	 * 以Map形式获取所有系统配置
	 * @return
	 */
	@Cacheable(value = "sysConfigCache", key = "'GetByMap'")
	public Map<String, String> getByMap(){
		List<SysConfig> list = listAll();
		Map<String, String> map = new HashMap<>();
		if(list != null){
			for(SysConfig config : list){
				map.put(config.getConfigCode(), config.getConfigValue());
			}
		}
		return map;
	}

	
	/**
	 * 更新配置值
	 * @param configCode
	 * @param configValue
	 * @param configName
	 * @param autocreate
	 * @return
	 */
	@CacheEvict(value = "sysConfigCache", allEntries = true)
	public SysError update(String configCode, String configValue, String configName, boolean autocreate){
		SysConfig sysConfig = getByProperty("configCode", configCode);
		if(sysConfig == null){
			if (autocreate) {
				sysConfig = new SysConfig(configCode, configValue, configName, "", new Date());
				this.save(sysConfig);
			}
		}else{
			//仅当旧值和新值不同时才更新
			if(!sysConfig.getConfigValue().equals(configValue)){
				sysConfig.setConfigValue(configValue);
				Updater<SysConfig> updater = new Updater<>(sysConfig, "configValue");
				this.update(updater);
			}
		}
		return null;
	}
	

	/**
	 * 获取配置值，不使用缓存，直接从数据库读取
	 * @param configCode
	 * @return
	 */
	public String getConfigValueIgnoreCache(String configCode){
		SysConfig sysConfig = getByProperty("configCode", configCode);
		if(sysConfig != null){
			return sysConfig.getConfigValue();
		}
		return null;
	}

	
	/**
	 * 更新参数值，直接更新数据库，不影响缓存
	 * @param configCode
	 * @param configValue
	 * @param configName
	 * @param autocreate
	 * @return
	 */
	public SysError updateIgnoreCache(String configCode, String configValue, String configName, boolean autocreate){
		SysConfig sysConfig = getByProperty("configCode", configCode);
		if(sysConfig == null){
			if (autocreate) {
				sysConfig = new SysConfig(configCode, configValue, configName, "", new Date());
				this.save(sysConfig);
			}
		}else{
			//仅当旧值和新值不同时才更新
			if(!sysConfig.getConfigValue().equals(configValue)){
				sysConfig.setConfigValue(configValue);
				Updater<SysConfig> updater = new Updater<>(sysConfig, "configValue");
				this.update(updater);
			}
		}
		return null;
	}
	
	
}
